/**
 * @file camera_utils.h
 * @brief 摄像头操作工具函数
 * @version 1.0
 * @date 2023-03-15
 */

#ifndef CAMERA_UTILS_H
#define CAMERA_UTILS_H

#include <stdbool.h>
#include <stdint.h>
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#include <pthread.h>
#include "common_defs.h" // 包含通用定义
#include "camera_time_sync.h" // 包含摄像头时间同步相关定义，避免重复定义

#ifdef __cplusplus
extern "C" {
#endif

// 通用摄像头结构体定义
typedef struct {
    AVFormatContext *format_ctx;
    AVCodecContext *codec_ctx;
    AVStream *video_stream;
    int video_stream_idx;
    AVFrame *frame;
    AVPacket *packet;
    struct SwsContext *sws_ctx;
    int width;
    int height;
    char rtsp_url[MAX_PATH_LENGTH];
    bool is_connected;
    pthread_mutex_t mutex;
    char *frame_buffer;
    uint64_t last_frame_time;
} Camera;

/**
 * @brief 初始化摄像头
 * 
 * @param camera 摄像头结构指针
 * @param rtsp_url RTSP URL
 * @param width 图像宽度
 * @param height 图像高度
 * @return int 成功返回0，失败返回错误码
 */
int camera_init(Camera *camera, const char *rtsp_url, int width, int height);

/**
 * @brief 检查摄像头连接状态
 * 
 * @param camera 摄像头结构指针
 * @return true 连接正常
 * @return false 连接已断开
 */
bool camera_check_connection(Camera *camera);

/**
 * @brief 关闭摄像头并释放资源
 * 
 * @param camera 摄像头结构指针
 */
void camera_close(Camera *camera);

/**
 * @brief 获取一帧视频
 * 
 * @param camera 摄像头结构指针
 * @param buffer 输出的图像缓冲区
 * @param width 输出的图像宽度
 * @param height 输出的图像高度
 * @return int 成功返回0，失败返回错误码
 */
int camera_get_frame(Camera *camera, uint8_t **buffer, int *width, int *height);

/**
 * @brief 释放帧资源
 * 
 * @param camera 摄像头结构指针
 */
void camera_release_frame(Camera *camera);

/**
 * @brief 获取当前时间戳（毫秒）
 * 
 * @return uint64_t 时间戳(毫秒)
 */
uint64_t get_timestamp_ms(void);

/**
 * @brief 直接获取摄像头单张图像并保存到文件
 *
 * @param ip 摄像头IP地址
 * @param username 用户名
 * @param password 密码
 * @param camera_type 摄像头类型
 * @param save_dir 保存目录
 * @param save_filename 文件名
 * @return int 成功返回0，失败返回非0值
 */
int capture_single_camera_image(const char *ip, const char *username, const char *password, 
                               CameraType camera_type, const char *save_dir, const char *save_filename);

#ifdef __cplusplus
}
#endif

#endif /* CAMERA_UTILS_H */ 